package com.spdd.mt.biz.service;

import com.spdd.mt.biz.entity.MtRechargeOrderEntity;
import com.spdd.mt.biz.vo.StatisticRechargeBean;
import com.spdd.mt.common.base.BaseService;

import java.util.Date;
import java.util.List;

/**
 * <p>
 * MtRechargeOrder 充值订单表 服务接口
 * </p>
 *
 * @author shanfeilong
 * @since 2025-04-02
 */
public interface MtRechargeOrderService extends BaseService<MtRechargeOrderEntity> {

    /**
     * 根据主键获取订单信息
     *
     * @param month 月份
     * @param id    主键
     */
    MtRechargeOrderEntity getById(String month, Long id);

    /**
     * 根据系统订单号获取订单信息
     *
     * @param orderNo SPDD订单号
     */
    MtRechargeOrderEntity getByOrderNo(String orderNo);


    /**
     * 根据美团订单号获取订单信息
     *
     * @param mtOrderNo 美团订单号
     */
    MtRechargeOrderEntity getByMtOrderNo(String mtOrderNo);

    /**
     * 查找首次回调通知失败，需要再次回调通知的订单
     *
     * @param month       订单月份
     * @param lastTime    时间
     * @param notifyTimes 通知次数
     */
    List<MtRechargeOrderEntity> getNeedNotify(String month, String lastTime, Integer notifyTimes);


    /**
     * 查找需要重新发送SPDD订单的订单
     *
     * @param month           订单月份
     * @param tradeDate       交易日期
     * @param maxReorderTimes 最大重试次数
     * @param startTime       订单开始时间限制
     * @param endTime         订单结束时间限制
     * @param maxCount        允许一次重发的最大订单数量
     */
    List<MtRechargeOrderEntity> getNeedReOrder(String month, String tradeDate, Integer maxReorderTimes, String startTime, String endTime, Integer maxCount);

    /**
     * 查询已完成的订单，用户生成对账单
     *
     * @param month   订单月份
     * @param day     日
     * @param merchNo 商户号
     */
    List<MtRechargeOrderEntity> getFinishByDayAndMerchNo(String month, Integer day, String merchNo);

    List<StatisticRechargeBean> getSuccessStatistic(String month, String txnDate, String appId);

    List<StatisticRechargeBean> getTotalStatistic(String month, String txnDate, String appId);

    List<StatisticRechargeBean> getRateStatistic(String month, String txnDate, Integer time, String appId);

    /**
     * 根据新订单
     *
     * @param entity 订单实体
     * @param month  月份
     */
    boolean save(MtRechargeOrderEntity entity, String month);

    /**
     * 根据主键更新订单
     *
     * @param entity 订单实体
     * @param month  月份
     * @param id     主键
     */
    boolean updateById(MtRechargeOrderEntity entity, String month, Long id);

    /**
     * 标记订单为待重发
     *
     * @param month           订单月份
     * @param id              主键
     * @param reorderStatus   待重发状态
     * @param lastReorderTime 最后一次重发时间
     */
    void updateReorder(String month, Long id, Integer reorderStatus, Date lastReorderTime);

    /**
     * 更新订单回调信息
     *
     * @param id             订单ID
     * @param month          订单月份
     * @param notifyStatus   通知状态
     * @param lastNotifyTime 最后一次通知时间
     */
    boolean updateNotify(Long id, String month, Integer notifyStatus, Date lastNotifyTime);

}
